// 七牛云DeepSeek角色扮演对话脚本
const axios = require('axios');

// 七牛云API配置
const QINIU_CONFIG = {
    baseUrl: 'https://openai.qiniu.com/v1',
    apiKey: 'sk-97fc588df536d5fb0230f07f463d4703f14d762ba2f8363913989827a90be900',
    // 备选接入点
    backupUrl: 'https://api.qnaigc.com/v1'
};

// 角色设定模板
const CHARACTER_PROMPTS = {
    '柯南': `你是江户川柯南（工藤新一），一个被黑衣组织灌下毒药变成小学生的天才侦探。

角色特点：
- 说话时会说"啊咧咧"、"真相只有一个"等经典台词
- 经常扶眼镜，镜片会闪过白光
- 推理能力超强，对任何谜题都感兴趣
- 语气自信但保持小学生的外表
- 喜欢用"在我眼中都像小学生作业一样简单"这样的比喻

请始终保持柯南的语气和性格特点，即使回答其他问题也要保持角色设定。`,

    '哈利波特': `你是哈利·波特，霍格沃茨魔法学校的学生，大难不死的男孩。

角色特点：
- 说话时带有英国口音的特点
- 经常提到魔法、咒语、霍格沃茨等
- 勇敢但有时会感到困惑
- 对朋友忠诚，对敌人勇敢
- 会使用魔法术语和咒语

请始终保持哈利·波特的语气和魔法世界的背景设定。`,

    '莎士比亚': `你是威廉·莎士比亚，英国文艺复兴时期的伟大剧作家和诗人。

角色特点：
- 说话风格华丽，富有诗意
- 经常使用比喻、隐喻等修辞手法
- 语言优雅，带有古典英语的特点
- 喜欢谈论爱情、人生、戏剧等主题
- 会引用自己的作品或创作新的诗句

请始终保持莎士比亚的文学风格和古典英语的表达方式。`
};

// 创建OpenAI客户端
function createQiniuClient() {
    return axios.create({
        baseURL: QINIU_CONFIG.baseUrl,
        headers: {
            'Authorization': `Bearer ${QINIU_CONFIG.apiKey}`,
            'Content-Type': 'application/json'
        }
    });
}

// 获取可用模型列表
async function getAvailableModels() {
    console.log('🔍 获取七牛云可用模型列表...');
    
    try {
        const client = createQiniuClient();
        const response = await client.get('/models');
        
        console.log('✅ 可用模型列表:');
        response.data.data.forEach(model => {
            console.log(`  - ${model.id}`);
        });
        
        return response.data.data;
    } catch (error) {
        console.error('❌ 获取模型列表失败:', error.response?.data || error.message);
        return [];
    }
}

// 角色扮演对话（非流式）
async function roleplayChat(character, userMessage, model = 'deepseek-v3') {
    console.log(`\n🎭 ${character} 角色扮演对话...`);
    console.log(`👤 用户: ${userMessage}`);
    
    try {
        const client = createQiniuClient();
        
        // 构建消息
        const messages = [
            {
                role: 'system',
                content: CHARACTER_PROMPTS[character] || `你是${character}，请保持该角色的特点和语气。`
            },
            {
                role: 'user',
                content: userMessage
            }
        ];
        
        const response = await client.post('/chat/completions', {
            model: model,
            messages: messages,
            stream: false,
            max_tokens: 2048,
            temperature: 0.8
        });
        
        const aiResponse = response.data.choices[0].message.content;
        console.log(`🤖 ${character}: ${aiResponse}`);
        
        return aiResponse;
    } catch (error) {
        console.error(`❌ ${character} 角色扮演失败:`, error.response?.data || error.message);
        return null;
    }
}

// 角色扮演对话（流式）
async function roleplayChatStream(character, userMessage, model = 'deepseek-v3') {
    console.log(`\n🎭 ${character} 角色扮演对话（流式）...`);
    console.log(`👤 用户: ${userMessage}`);
    
    try {
        const client = createQiniuClient();
        
        // 构建消息
        const messages = [
            {
                role: 'system',
                content: CHARACTER_PROMPTS[character] || `你是${character}，请保持该角色的特点和语气。`
            },
            {
                role: 'user',
                content: userMessage
            }
        ];
        
        const response = await client.post('/chat/completions', {
            model: model,
            messages: messages,
            stream: true,
            max_tokens: 2048,
            temperature: 0.8
        }, {
            responseType: 'stream'
        });
        
        console.log(`🤖 ${character}: `);
        let fullResponse = '';
        
        return new Promise((resolve, reject) => {
            response.data.on('data', (chunk) => {
                const lines = chunk.toString().split('\n');
                for (const line of lines) {
                    if (line.startsWith('data: ')) {
                        const data = line.slice(6);
                        if (data === '[DONE]') {
                            console.log('\n');
                            resolve(fullResponse);
                            return;
                        }
                        try {
                            const parsed = JSON.parse(data);
                            if (parsed.choices && parsed.choices[0] && parsed.choices[0].delta && parsed.choices[0].delta.content) {
                                const content = parsed.choices[0].delta.content;
                                process.stdout.write(content);
                                fullResponse += content;
                            }
                        } catch (e) {
                            // 忽略解析错误
                        }
                    }
                }
            });
            
            response.data.on('error', (error) => {
                console.error('\n❌ 流式响应错误:', error);
                reject(error);
            });
        });
        
    } catch (error) {
        console.error(`❌ ${character} 流式角色扮演失败:`, error.response?.data || error.message);
        return null;
    }
}

// 联网搜索功能（角色扮演中）
async function roleplayWithSearch(character, userMessage, model = 'deepseek-v3') {
    console.log(`\n🌐 ${character} 联网搜索角色扮演...`);
    console.log(`👤 用户: ${userMessage}`);
    
    try {
        const client = createQiniuClient();
        
        // 使用联网搜索模型
        const searchModel = `${model}?search`;
        
        // 构建消息
        const messages = [
            {
                role: 'system',
                content: CHARACTER_PROMPTS[character] || `你是${character}，请保持该角色的特点和语气。你可以搜索最新信息来回答用户的问题。`
            },
            {
                role: 'user',
                content: userMessage
            }
        ];
        
        const response = await client.post('/chat/completions', {
            model: searchModel,
            messages: messages,
            stream: false,
            max_tokens: 2048,
            temperature: 0.8
        });
        
        const aiResponse = response.data.choices[0].message.content;
        console.log(`🤖 ${character}: ${aiResponse}`);
        
        return aiResponse;
    } catch (error) {
        console.error(`❌ ${character} 联网搜索角色扮演失败:`, error.response?.data || error.message);
        return null;
    }
}

// 多轮对话
async function multiTurnChat(character, conversations, model = 'deepseek-v3') {
    console.log(`\n💬 ${character} 多轮对话...`);
    
    try {
        const client = createQiniuClient();
        
        // 构建消息历史
        const messages = [
            {
                role: 'system',
                content: CHARACTER_PROMPTS[character] || `你是${character}，请保持该角色的特点和语气。`
            }
        ];
        
        // 添加对话历史
        conversations.forEach(conv => {
            messages.push({
                role: 'user',
                content: conv.user
            });
            messages.push({
                role: 'assistant',
                content: conv.assistant
            });
        });
        
        const response = await client.post('/chat/completions', {
            model: model,
            messages: messages,
            stream: false,
            max_tokens: 2048,
            temperature: 0.8
        });
        
        const aiResponse = response.data.choices[0].message.content;
        console.log(`🤖 ${character}: ${aiResponse}`);
        
        return aiResponse;
    } catch (error) {
        console.error(`❌ ${character} 多轮对话失败:`, error.response?.data || error.message);
        return null;
    }
}

// 测试函数
async function runTests() {
    console.log('🚀 开始测试七牛云DeepSeek角色扮演功能...\n');
    
    // 1. 获取可用模型
    await getAvailableModels();
    
    // 2. 测试柯南角色扮演
    await roleplayChat('柯南', '请你以柯南的语气和我进行对话');
    
    // 3. 测试柯南联网搜索
    await roleplayWithSearch('柯南', '今天北京天气怎么样？');
    
    // 4. 测试哈利波特角色扮演
    await roleplayChat('哈利波特', '你好哈利，能告诉我你在霍格沃茨的第一天是怎么度过的吗？');
    
    // 5. 测试莎士比亚角色扮演
    await roleplayChat('莎士比亚', '请用莎士比亚的风格写一首关于友谊的十四行诗');
    
    // 6. 测试流式对话
    console.log('\n📡 测试流式对话...');
    await roleplayChatStream('柯南', '柯南，你能帮我推理一下这个案件吗？');
    
    // 7. 测试多轮对话
    console.log('\n🔄 测试多轮对话...');
    const conversations = [
        {
            user: '你好柯南',
            assistant: '啊咧咧，你好！我是江户川柯南，有什么谜题需要我帮忙解决吗？'
        }
    ];
    await multiTurnChat('柯南', conversations);
    
    console.log('\n🎉 所有测试完成！');
}

// 交互式对话
async function interactiveChat() {
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });
    
    console.log('🎭 七牛云DeepSeek角色扮演交互式对话');
    console.log('可用角色: 柯南, 哈利波特, 莎士比亚');
    console.log('输入 "exit" 退出\n');
    
    const askQuestion = () => {
        rl.question('请选择角色 (默认柯南): ', (character) => {
            if (character === 'exit') {
                rl.close();
                return;
            }
            
            const selectedCharacter = character || '柯南';
            
            rl.question('请输入消息: ', async (message) => {
                if (message === 'exit') {
                    rl.close();
                    return;
                }
                
                await roleplayChat(selectedCharacter, message);
                console.log('\n');
                askQuestion();
            });
        });
    };
    
    askQuestion();
}

// 主函数
async function main() {
    const args = process.argv.slice(2);
    
    if (args.includes('--interactive') || args.includes('-i')) {
        await interactiveChat();
    } else if (args.includes('--test') || args.includes('-t')) {
        await runTests();
    } else {
        console.log('使用方法:');
        console.log('  node qiniu-deepseek-roleplay.js --test     # 运行测试');
        console.log('  node qiniu-deepseek-roleplay.js --interactive  # 交互式对话');
        console.log('\n直接运行测试...');
        await runTests();
    }
}

// 导出函数供其他模块使用
module.exports = {
    roleplayChat,
    roleplayChatStream,
    roleplayWithSearch,
    multiTurnChat,
    getAvailableModels,
    CHARACTER_PROMPTS
};

// 如果直接运行此脚本
if (require.main === module) {
    main().catch(console.error);
}
